package org.tissou.server.Base;

import org.tissou.server.Utils.InterfaceMySQL;
import org.tissou.client.Services.MonException;
import org.tissou.server.Utils.Variables_Globales;

import java.util.List;
import java.util.Collection;
import java.util.logging.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.tissou.client.Services.Compte;
import org.tissou.client.Services.ProprietaireInfos;

/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 30-Nov-2008
 * Time: 15:25:43
 * To change this template use File | Settings | File Templates.
 */


public class Proprietaire {
  private ProprietaireInfos infos;
  private static final Logger LOG = Logger.getLogger(Proprietaire.class.getName());


  public Proprietaire(ProprietaireInfos infos){
    this.infos = infos;
  }

  private void MiseAJourComptesExistants(){
    infos.getTousLesComptes().clear();
    try {
      ResultSet result = InterfaceMySQL.getInstance().RecupererDonnees(
          String.format("SELECT * FROM Comptes WHERE Proprietaire = '%s' ORDER BY NoCompte",
              this.infos.getNom()));
      while(result.next()){
        int NumeroCompte = result.getInt("NoCompte");
        LOG.info(String.valueOf(NumeroCompte));
        String NomCompte = result.getString("NomCompte");
        LOG.info(NomCompte);
        int Virt = result.getInt("Virtuel");
        LOG.info(String.valueOf(Virt));
        String NomMonnaie = result.getString("Monnaie");
        LOG.info(NomMonnaie);
        Monnaie monnaie = Monnaie.ChargerMonnaie(NomMonnaie);
        Compte c = new Compte(NumeroCompte, this.infos, Virt==1, NomCompte, monnaie.getInfos());
        infos.addCompte(c);
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }


  public static Proprietaire ChargerProprietaire (String n){
    ProprietaireInfos informations = new ProprietaireInfos(n);
    Proprietaire Charge = new Proprietaire(informations);
    Charge.MiseAJourComptesExistants();

    return Charge;
  }

  public static Proprietaire ChargerProprietaire(ProprietaireInfos informations){

    Proprietaire Charge = new Proprietaire(informations);
    Charge.MiseAJourComptesExistants();
    return Charge;
  }

  public void CreerCompte(boolean vir, String nom, Monnaie monn){
    try {
      InterfaceMySQL.getInstance().EnvoyerQuery(
          String.format("INSERT INTO Comptes(Proprietaire, Virtuel, NomCompte, Monnaie) " +
              "VALUES('%s', '%d', '%s (%s)', '%s')",
              this.infos.getNom(), vir ? 1 : 0, nom, monn.getNomMonnaie(), monn.getNomMonnaie()));
    } catch (SQLException e) {

      if(e.getErrorCode() == 1062){
        throw new MonException("Le compte existe deja.",e);
      }
      else throw new MonException("Impossible de creer le compte dans la base de donnees",e);
    }
    this.MiseAJourComptesExistants();
  }

  public static void CreerProprietaire(String nom){
    Proprietaire nouveauproprietaire;
    ProprietaireInfos nouvellesinfos;

    ResultSet result;
    try {
      result = InterfaceMySQL.getInstance().RecupererDonnees(
      String.format("SELECT DISTINCT(Proprietaire) FROM Comptes WHERE Proprietaire = '%s'", nom)
      );
    } catch (SQLException e) {
      throw new MonException("Mauvaise formulation de Query", e);
    }
    try {
      if (!result.next()) {
        nouvellesinfos = new ProprietaireInfos(nom);
        nouveauproprietaire = new Proprietaire (nouvellesinfos);
        for(Monnaie monnaie : Variables_Globales.ListeMonnaies.Liste){
          nouveauproprietaire.CreerCompte(true, "Virtuel", monnaie);
          nouveauproprietaire.CreerCompte(false, "Portefeuille", monnaie);
        }
      }
      else
      throw new MonException("Le proprietaire existe deja !");
    } catch (SQLException e) {
      throw new MonException(e.getLocalizedMessage(), e);
    }
    Variables_Globales.ListeProprietaire = Proprietaire_Ensemble.ChargerEnsembleProprietaire();
  }

  public List<Compte> RenvoyerComptesVirtuels(){
    return infos.RenvoyerComptesVirtuels();
  }

  public Compte RenvoyerCompteVirtuel (Monnaie monnaie){
    return infos.RenvoyerCompteVirtuel(monnaie.getInfos());
  }
  
  public String ObtenirlisteComptesPourUneMonnaieDonneeSousFormeDeString (Monnaie monnaie){
	  return infos.listeComptesPourUneMonnaieDonneeSousFormeDeString(monnaie.getInfos());
  }

  public Compte ObtenirCompte (String nom){
    return infos.ObtenirCompte(nom);
  }

  public Compte ObtenirCompte (int nocompte){
    return infos.ObtenirCompte(nocompte);
  }

  public Collection<Compte> ObtenirTousLesComptes () {
    return infos.getTousLesComptes().values();
  }

  public boolean equals(Object proprietaire){
    return proprietaire instanceof Proprietaire && getNom().equalsIgnoreCase(((Proprietaire)proprietaire).getNom());
  }

  public String getNom() {
    return infos.getNom();
  }

  public ProprietaireInfos getInfos() {
    return infos;
  }
}
